package tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import fachada.Fachada;
import interfaces.IFachada;

import java.util.List;

import modelos.Aluno;
import modelos.Funcionario;

import org.junit.After;
import org.junit.Test;

public class FuncionarioTest {

	private static IFachada fachada = new Fachada();

	@After
	public void tearDown() throws Exception {
		List<Funcionario> funcionarios = fachada.listarFuncionarios();
		for(Funcionario f : funcionarios) {
			fachada.removerFuncionario(f);
		}
	}

	@Test
	public void testSalvarFuncionario() {
		assertEquals(0, fachada.listarPessoas().size());
		assertEquals(0, fachada.listarFuncionarios().size());
		
		Funcionario f1 = new Funcionario();
		f1.setNome("pedro");
		f1.setCpf("000.000.000-00");
		f1.setCodigo("0");
		f1 = fachada.salvarFuncionario(f1);
		
		assertEquals(1, fachada.listarPessoas().size());
		assertEquals(1, fachada.listarFuncionarios().size());
		assertEquals(0, fachada.listarAlunos().size());
		
		Funcionario f2 = new Funcionario();
		f2.setNome("pedro tiago");
		f2.setCpf("100.000.000-00");
		f2.setCodigo("0");
		f2 = fachada.salvarFuncionario(f2);
		
		assertNull(f2);
		assertNotSame(2, fachada.listarFuncionarios().size());
		assertEquals(1, fachada.listarFuncionarios().size());
	}
	
	@Test
	public void testAtualizarFuncionario() {
		assertEquals(0, fachada.listarPessoas().size());
		assertEquals(0, fachada.listarFuncionarios().size());
		assertEquals(0, fachada.listarAlunos().size());
		
		Funcionario f1 = new Funcionario();
		f1.setNome("pedro");
		f1.setCpf("000.000.000-00");
		f1.setCodigo("0");
		f1 = fachada.salvarFuncionario(f1);
		assertNotNull(f1);
		
		f1.setNome("pedro tiago");
		f1 = fachada.atualizarFuncionario(f1);
		assertNotNull(f1);
		assertNotSame("pedro", f1.getNome());
		assertEquals("pedro tiago", f1.getNome());
		
		Funcionario f2 = new Funcionario();
		f2.setNome("david");
		f2.setEmail("david@ffm.com.br");
		f2.setCpf("111.111.111-11");
		f2.setCodigo("1");
		f2 = fachada.salvarFuncionario(f2);
		
		assertEquals(2, fachada.listarPessoas().size());
		assertEquals(2, fachada.listarFuncionarios().size());
		assertEquals(0, fachada.listarAlunos().size());
		assertNotNull(f2);
		
		assertEquals("david", f2.getNome());
		assertEquals("david@ffm.com.br", f2.getEmail());
		
		f1.setEmail("pedrotiago@ffm.com.br");
		f1.setCodigo("2");
		f1 = fachada.atualizarFuncionario(f1);
		assertNotNull(f1);
		assertEquals("pedrotiago@ffm.com.br", f1.getEmail());
		
		assertEquals("1", fachada.getFuncionarioPorCpf("111.111.111-11").getCodigo());
		assertEquals("2", fachada.getFuncionarioPorCpf("000.000.000-00").getCodigo());
	}
	
	@Test
	public void testRemoverPessoa() {
		assertEquals(0, fachada.listarPessoas().size());
		assertEquals(0, fachada.listarFuncionarios().size());
		
		Funcionario f1 = new Funcionario();
		f1.setNome("pedro");
		f1.setCpf("000.000.000-00");
		f1.setCodigo("0");
		f1 = fachada.salvarFuncionario(f1);
		
		Funcionario f2 = new Funcionario();
		f1.setNome("jairo");
		f1.setCpf("222.222.222-22");
		f1.setCodigo("1");
		f1 = fachada.salvarFuncionario(f1);
		
		Funcionario a3 = new Funcionario();
		f2.setNome("david");
		f2.setEmail("david@ffm.com.br");
		f2.setCpf("111.111.111-11");
		f2.setCodigo("2");
		f2 = fachada.salvarFuncionario(f2);
		
		assertEquals(3, fachada.listarPessoas().size());
		assertEquals(3, fachada.listarFuncionarios().size());
		assertNotNull(f1);
		
		f1 = fachada.getFuncionarioPorCodigo("1");
		assertNotNull(f1);
		fachada.removerFuncionario(f1);
		assertEquals(2, fachada.listarFuncionarios().size());
		assertEquals(2, fachada.listarFuncionarios().size());
		assertNull(fachada.getFuncionarioPorCodigo("1"));
		
		f1 = fachada.getFuncionarioPorCodigo("2");
		fachada.removerFuncionario(f1);
		assertEquals(1, fachada.listarPessoas().size());
		assertEquals(1, fachada.listarFuncionarios().size());
		assertNull(fachada.getFuncionarioPorCpf("111.111.111-11"));
		
		f1 = fachada.getFuncionarioPorCpf("000.000.000-00");
		fachada.removerFuncionario(f1);
		assertEquals(0, fachada.listarPessoas().size());
		assertEquals(0, fachada.listarFuncionarios().size());
		assertNull(fachada.getFuncionarioPorCodigo("0"));
	}

}
